'''
n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上，并且使皇后彼此之间不能相互攻击。

给你一个整数 n ，返回 n 皇后问题 不同的解决方案的数量。。
'''

class Solution:
    def totalNQueens(self, n: int) -> int:
        res = 0
        
        def backtrack(board,row):
            if row == len(board):
                res += 1
                return 

            n = len(board[row])

            for col in range(n):
                if not isValid(board,row,col):
                    continue

                board[row][col] = 'Q'
                backtrack(board,row + 1)
                board[row][col] = '.'
            
        def isValid(board,row,col):
            n = len(board)

            for i in range(n):
                if board[i][col] == 'Q':
                    return False
            
            r,c = row - 1,col + 1
            while r >= 0 and c < n:
                if board[r][c] == 'Q':
                    return False
                r -= 1
                c += 1

            r,c = row - 1,col - 1
            while r >= 0 and c >= 0:
                if board[r][c] == 'Q':
                    return False
                r -= 1
                c -= 1
            return True
        board = [["."] * n for _ in range(n)]
        backtrack(board,0)
        return res
        
